idUtils =

  # 身份证地区
  aCity:
    11: '北京'
    12: '天津'
    13: '河北'
    14: '山西'
    15: '内蒙古'
    21: '辽宁'
    22: '吉林'
    23: '黑龙江'
    31: '上海'
    32: '江苏'
    33: '浙江'
    34: '安徽'
    35: '福建'
    36: '江西'
    37: '山东'
    41: '河南'
    42: '湖北'
    43: '湖南'
    44: '广东'
    45: '广西'
    46: '海南'
    50: '重庆'
    51: '四川'
    52: '贵州'
    53: '云南'
    54: '西藏'
    61: '陕西'
    62: '甘肃'
    63: '青海'
    64: '宁夏'
    65: '新疆'
    71: '台湾'
    81: '香港'
    82: '澳门'
    91: '国外'

  # 判断证件类型
  checkIdLegal: (id_kind, id_no) ->
    if '0' is id_kind
      idUtils.isCardID id_no
    else if '2' is id_kind
      idUtils.isValidBusCode id_no
    else
      return true

  # 验证身份证的合法性
  isCardID : (sId) ->
    iSum = 0
    info = ''
    if !/^\d{17}(\d|x)$/i.test(sId)
      return '您输入的身份证长度或格式错误'
    sId = sId.replace(/x$/i, 'a')
    if idUtils?.aCity[parseInt(sId.substr(0, 2))] == null
      return '您身份证地区非法'
    sBirthday = sId.substr(6, 4) + '-' + Number(sId.substr(10, 2)) + '-' + Number(sId.substr(12, 2))
    d = new Date(sBirthday.replace(/-/g, '/'))
    if sBirthday != d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()
      return '您身份证上的出生日期非法'
    i = 17
    while i >= 0
      iSum += 2 ** i % 11 * parseInt(sId.charAt(17 - i), 11)
      i--
    if iSum % 11 != 1
      return '您输入的身份证号非法'
    true

  # 校验营业执照的合法性
  isValidBusCode: (busCode) ->

    # 15位长度的营业执照
    if 15 is busCode?.length
      ret=false

      sum=0
      s=[]
      p=[]
      a=[]
      m=10
      p[0]=m
      for i in [0...15]
        a[i]=parseInt(busCode.substring(i,i+1),m)
        s[i]=(p[i]%(m+1))+a[i]
        if 0==s[i]%m
          p[i+1]=10*2
        else
          p[i+1]=(s[i]%m)*2

      if 1==(s[14]%m)
        return true

      else
        return '营业执照格式错误'

    # 18位长度的营业执照
    else if 18 is busCode?.length

      # 编码规则:
      # 统一代码为18位，统一代码由十八位的数字或大写英文字母（不适用I、O、Z、S、V）组成，由五个部分组成：
      # 第一部分（第1位）为登记管理部门代码，9表示工商部门；(数字或大写英文字母)
      # 第二部分（第2位）为机构类别代码;(数字或大写英文字母)
      # 第三部分（第3-8位）为登记管理机关行政区划码；(数字)
      # 第四部分（第9-17位）为全国组织机构代码；(数字或大写英文字母)
      # 第五部分（第18位）为校验码(数字或大写英文字母)

      patrn = /[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}/
      if not patrn.test(busCode)
        return "营业执照格式错误"
      else
        return true

    else
      return '营业执照长度有误'

module.exports = idUtils